package br.ucb.ucblive.managedbean;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.event.SelectEvent;
import org.primefaces.model.DefaultScheduleEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.LazyScheduleModel;
import org.primefaces.model.ScheduleEvent;
import org.primefaces.model.ScheduleModel;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;

import br.ucb.ucblive.HIB.CursoHIB;
import br.ucb.ucblive.HIB.EventoHIB;
import br.ucb.ucblive.HIB.UsuarioHIB;
import br.ucb.ucblive.beans.Curso;
import br.ucb.ucblive.beans.Evento;
import br.ucb.ucblive.beans.Usuario;
import br.ucb.ucblive.recursos.MensagemConfirmacao;

@ManagedBean (name="eventoManagedBean")
@SessionScoped
public class EventoManagedBean {
	private Evento evento;
	private List<Evento> eventos;
	private EventoHIB eventoHib;
	private String query;
	private Usuario usuarioLogin;
	private UsuarioHIB usuarioHib;
	private List<Curso> cursos;
	private CursoHIB cursoHIB;
	private ScheduleModel eventoModel;  
	private ScheduleEvent eventoSchedule;
	private MensagemConfirmacao mensagemConfirmacao;
	private boolean eventoAlterado;
	private UploadedFile arquivo;
	
	public EventoManagedBean(){
		setEvento(new Evento());
		setEventos(new ArrayList<Evento>());
		setEventoHib(new EventoHIB());
		setQuery(new String());
		setUsuarioHib(new UsuarioHIB());
		setUsuarioLogin(usuarioHib.consultar(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName()));
		setMensagemConfirmacao(new MensagemConfirmacao());
		setEventoAlterado(false);
	}

	
	
	public boolean isEventoAlterado() {
		return eventoAlterado;
	}



	public void setEventoAlterado(boolean eventoAlterado) {
		this.eventoAlterado = eventoAlterado;
	}



	public MensagemConfirmacao getMensagemConfirmacao() {
		return mensagemConfirmacao;
	}


	public void setMensagemConfirmacao(MensagemConfirmacao mensagemConfirmacao) {
		this.mensagemConfirmacao = mensagemConfirmacao;
	}


	public Evento getEvento() {
		return evento;
	}

	public void setEvento(Evento evento) {
		this.evento = evento;
	}

	public List<Evento> getEventos() {
		return eventos;
	}

	public void setEventos(List<Evento> eventos) {
		this.eventos = eventos;
	}

	public EventoHIB getEventoHib() {
		return eventoHib;
	}

	public void setEventoHib(EventoHIB eventoHib) {
		this.eventoHib = eventoHib;
	}
	public String getQuery() {
		return query;
	}

	public void setQuery(String query) {
		this.query = query;
	}
	
	public Usuario getUsuarioLogin() {
		return usuarioLogin;
	}

	public void setUsuarioLogin(Usuario usuarioLogin) {
		this.usuarioLogin = usuarioLogin;
	}

	public UsuarioHIB getUsuarioHib() {
		return usuarioHib;
	}

	public void setUsuarioHib(UsuarioHIB usuarioHib) {
		this.usuarioHib = usuarioHib;
	}

	public List<Curso> getCursos() {
		return cursos;
	}

	public void setCursos(List<Curso> cursos) {
		this.cursos = cursos;
	}

	public CursoHIB getCursoHIB() {
		return cursoHIB;
	}

	public void setCursoHIB(CursoHIB cursoHIB) {
		this.cursoHIB = cursoHIB;
	}

	public ScheduleModel getEventoModel() {
		return eventoModel;
	}

	public void setEventoModel(ScheduleModel eventoModel) {
		this.eventoModel = eventoModel;
	}

	public ScheduleEvent getEventoSchedule() {
		return eventoSchedule;
	}

	public void setEventoSchedule(ScheduleEvent eventoSchedule) {
		this.eventoSchedule = eventoSchedule;
	}

	public UploadedFile getArquivo() {
		return arquivo;
	}

	public void setArquivo(UploadedFile arquivo) {
		this.arquivo = arquivo;
	}

	public String insere(){
		if(getEvento().getIdEvento()==0)
			getEvento().setDataCriacao(new Date());
		getEvento().setDataAlteracao(new Date());
		getEvento().setUsuario(usuarioLogin);
		getEvento().setCurso(usuarioLogin.getModerador().getCurso());
		getEventos().add(evento);
		eventoHib.salvar(evento);
		setEvento(new Evento());
		if(isEventoAlterado()) getMensagemConfirmacao().eventoAlterado();
		else getMensagemConfirmacao().eventoCriado();
		setEventoAlterado(false);
		return "index.jsf";
	}
	
	public void excluir(ActionEvent e){
		if(((Evento) e.getComponent().getAttributes().get("evento")) instanceof Evento)
			setEvento((Evento) e.getComponent().getAttributes().get("evento"));
		eventoHib.excluir(evento);
		setEventos(new ArrayList<Evento>());
		setEvento(new Evento());
		eventos.addAll(eventoHib.listar());
		getMensagemConfirmacao().eventoExcluido();
	}
	
	public String atualiza(){ 
		setQuery(new String());
		setEventoAlterado(true);
		return "/mod/eventoForm?faces-redirect=true";
	}
	
	/**
	 * M�todo que retorna uma lista de Eventos
	 * @param query
	 * @return
	 */
	public String listarEventos(){
		eventoModel = new LazyScheduleModel(){

		@Override
    	public void loadEvents(Date start, Date end) {
    	   clear();
    	   setUsuarioLogin(usuarioHib.consultar(FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName()));
    	   setEventos(eventoHib.listarByUsuario(usuarioLogin));
    	   for (Evento evento : eventos) {
    		   start = evento.getDataInicio();
    		   end = evento.getDataFim();
    		   addEvent(new DefaultScheduleEvent(evento.getTitulo(), start, end, evento));
    	   }
    		
    	}
       };
       return "/alu/eventoList?faces-redirect=true";
	}
	
	public void onEventSelect(SelectEvent selectEvent) {  
        eventoSchedule = (ScheduleEvent) selectEvent.getObject();  
        evento = (Evento) eventoSchedule.getData();
    }  
	
	public void upload() {  
		if(arquivo!=null)
			evento.setFotoEvento(arquivo.getContents());
    }
	
	public StreamedContent getFoto(){
		if(evento.getFotoEvento()!=null){
			InputStream stream = new ByteArrayInputStream(evento.getFotoEvento());
			StreamedContent imagem = new DefaultStreamedContent(stream);		
			return imagem;
		}
		return new DefaultStreamedContent();
	}
	
	public String cadastrarEvento(){
		setEvento(new Evento());
		return "/mod/eventoForm.jsf?faces-redirect=true";
	}
}
